{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分类训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 机器学习的HelloWorld ，一个新的分类算法，都会看看在MNIST的上的执行结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i',2) # 高位字节"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "![jupyter](./g1.png)\n",
    "![jupyter](./g2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "# 导入数据\n",
    "import struct\n",
    "# 从指定路径读取数据\n",
    "with open('./MNIST_data/train-images-idx3-ubyte', 'rb') as f:\n",
    "    # 内容\n",
    "    buffer = f.read(4*4) # 4个int\n",
    "    # 解析出4个int类型\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    # 读图片 像素6w*28*28\n",
    "    length = head[1] * head[2]  * head[3]\n",
    "    print(length)\n",
    "    # 像素包\n",
    "    buffer = f.read(length)\n",
    "    # 读取的字节数\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "# 将数据 转换维度   所有的图片\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape # 6w个图片 28行 28列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f192208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f1e0710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nbAsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x27371b2ac50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADHVJREFUeJzt3V2oXfWZx/Hvo9MipEWjYhKtYzpF\nhhmCkw5BBgxDhokhDgHtRUO9GCKtTS+qTGEERYQqQ0HGaWdENJDSvEFrW4hOpJRpS/BlhlQxilTb\nJK2E2MaEk4qV6lXQ88zFWSnHeM7aJ/tt7Zzn+4Gw917/tdd6WOR3/mvt9fKPzERSPRd0XYCkbhh+\nqSjDLxVl+KWiDL9UlOGXijL8UlGGXyrK8EtF/dk4VxYRXk4ojVhmxkLmG6jnj4iNEXEkIl6PiHsG\nWZak8Yp+r+2PiAuBXwM3AseBF4FbM/NXLd+x55dGbBw9//XA65l5NDNPA98Hbh5geZLGaJDwXwX8\nbtbn4820D4mIrRFxMCIODrAuSUM2yA9+c+1afGS3PjO3A9vB3X5pkgzS8x8Hrp71+VPAicHKkTQu\ng4T/ReDaiPh0RHwc+ALw1HDKkjRqfe/2Z+b7EXEH8BPgQmBHZv5yaJVJGqm+T/X1tTKP+aWRG8tF\nPpLOX4ZfKsrwS0UZfqkowy8VZfilogy/VJThl4oy/FJRhl8qyvBLRRl+qSjDLxVl+KWiDL9UlOGX\nijL8UlGGXyrK8EtFGX6pKMMvFWX4paIMv1SU4ZeKMvxSUYZfKsrwS0UZfqkowy8V1fcQ3QARcQx4\nF/gAeD8z1wyjKAngvvvua21/4IEHWtsvuGD+vm3dunWt33322Wdb2xeDgcLf+IfMfGsIy5E0Ru72\nS0UNGv4EfhoRL0XE1mEUJGk8Bt3tvyEzT0TEFcDPIuJwZj43e4bmj4J/GKQJM1DPn5knmtdTwJPA\n9XPMsz0z1/hjoDRZ+g5/RCyJiE+eeQ9sAF4bVmGSRmuQ3f5lwJMRcWY538vM/xlKVZJGru/wZ+ZR\n4G+GWIuKue2221rb77777tb26enpvtedmX1/d7HwVJ9UlOGXijL8UlGGXyrK8EtFGX6pqGHc1Sf1\n5Zprrmltv+iii8ZUSU32/FJRhl8qyvBLRRl+qSjDLxVl+KWiDL9UlOf5NVLr16+ft+3OO+8caNmH\nDx9ubd+0adO8bVNTUwOtezGw55eKMvxSUYZfKsrwS0UZfqkowy8VZfilojzPr4GsXbu2tX3nzp3z\ntl188cUDrfuhhx5qbX/jjTcGWv5iZ88vFWX4paIMv1SU4ZeKMvxSUYZfKsrwS0X1PM8fETuATcCp\nzFzVTLsU+AGwEjgGbM7MP4yuTE2qLVu2tLZfeeWVfS/7mWeeaW3fs2dP38vWwnr+XcDGs6bdA+zP\nzGuB/c1nSeeRnuHPzOeAt8+afDOwu3m/G7hlyHVJGrF+j/mXZeZJgOb1iuGVJGkcRn5tf0RsBbaO\nej2Szk2/Pf9URKwAaF5PzTdjZm7PzDWZuabPdUkagX7D/xRw5mfeLcC+4ZQjaVx6hj8iHgd+Dvxl\nRByPiC8BDwI3RsRvgBubz5LOI5GZ41tZxPhWpqG4/PLLW9t7Pf9+enp63rZ33nmn9bubN29ubX/6\n6adb26vKzFjIfF7hJxVl+KWiDL9UlOGXijL8UlGGXyrKR3cXt3Llytb2vXv3jmzdjzzySGu7p/JG\ny55fKsrwS0UZfqkowy8VZfilogy/VJThl4ryPH9xGzee/WDmD7vuuusGWv7+/fvnbXv44YcHWrYG\nY88vFWX4paIMv1SU4ZeKMvxSUYZfKsrwS0X56O5F7pZb2sdQ3bVrV2v7kiVLWtsPHDjQ2t72+O1e\nj/1Wf3x0t6RWhl8qyvBLRRl+qSjDLxVl+KWiDL9UVM/7+SNiB7AJOJWZq5pp9wNfBn7fzHZvZv54\nVEWqXduz90f53H2Ao0ePtrZ7Ln9yLaTn3wXM9cSH/8zM1c0/gy+dZ3qGPzOfA94eQy2SxmiQY/47\nIuIXEbEjIpYOrSJJY9Fv+LcBnwFWAyeBb843Y0RsjYiDEXGwz3VJGoG+wp+ZU5n5QWZOA98Grm+Z\nd3tmrsnMNf0WKWn4+gp/RKyY9fFzwGvDKUfSuCzkVN/jwDrg8og4DnwdWBcRq4EEjgFfGWGNkkbA\n+/kXgW3bts3bdvvtt4903atWrWptP3LkyEjXr4/yfn5JrQy/VJThl4oy/FJRhl8qyvBLRTlE93lg\n9erVre0bNmwY2br37dvX2u6pvPOXPb9UlOGXijL8UlGGXyrK8EtFGX6pKMMvFeUtveeBU6dOtbYv\nXdr/IxSff/751vabbrqptf29997re90aDW/pldTK8EtFGX6pKMMvFWX4paIMv1SU4ZeK8n7+88Bl\nl13W2j49Pd33sh977LHWds/jL172/FJRhl8qyvBLRRl+qSjDLxVl+KWiDL9UVM/z/BFxNbAHWA5M\nA9sz8+GIuBT4AbASOAZszsw/jK7UxWvnzp2t7RdcMLq/0QcOHBjZsjXZFvK/6n3gXzPzr4C/A74a\nEX8N3APsz8xrgf3NZ0nniZ7hz8yTmfly8/5d4BBwFXAzsLuZbTdwy6iKlDR857Q/GRErgc8CLwDL\nMvMkzPyBAK4YdnGSRmfB1/ZHxCeAvcDXMvOPEQt6TBgRsRXY2l95kkZlQT1/RHyMmeB/NzOfaCZP\nRcSKpn0FMOdTJjNze2auycw1wyhY0nD0DH/MdPHfAQ5l5rdmNT0FbGnebwHah3OVNFEWstt/A/DP\nwKsR8Uoz7V7gQeCHEfEl4LfA50dT4vmv1xDb69evb23vdcvu6dOn52179NFHW787NTXV2q7Fq2f4\nM/P/gPkO8P9xuOVIGhev8JOKMvxSUYZfKsrwS0UZfqkowy8V5aO7x+CSSy5pbV++fPlAy3/zzTfn\nbbvrrrsGWrYWL3t+qSjDLxVl+KWiDL9UlOGXijL8UlGGXyrK8EtFGX6pKMMvFWX4paIMv1SU4ZeK\nMvxSUYZfKsr7+cfg8OHDre29hsleu3btMMuRAHt+qSzDLxVl+KWiDL9UlOGXijL8UlGGXyoqMrN9\nhoirgT3AcmAa2J6ZD0fE/cCXgd83s96bmT/usaz2lUkaWGbGQuZbSPhXACsy8+WI+CTwEnALsBl4\nLzP/Y6FFGX5p9BYa/p5X+GXmSeBk8/7diDgEXDVYeZK6dk7H/BGxEvgs8EIz6Y6I+EVE7IiIpfN8\nZ2tEHIyIgwNVKmmoeu72/2nGiE8AzwLfyMwnImIZ8BaQwL8xc2jwxR7LcLdfGrGhHfMDRMTHgB8B\nP8nMb83RvhL4UWau6rEcwy+N2ELD33O3PyIC+A5waHbwmx8Cz/gc8Nq5FimpOwv5tX8t8L/Aq8yc\n6gO4F7gVWM3Mbv8x4CvNj4Nty7Lnl0ZsqLv9w2L4pdEb2m6/pMXJ8EtFGX6pKMMvFWX4paIMv1SU\n4ZeKMvxSUYZfKsrwS0UZfqkowy8VZfilogy/VNS4h+h+C3hj1ufLm2mTaFJrm9S6wNr6Nczarlno\njGO9n/8jK484mJlrOiugxaTWNql1gbX1q6va3O2XijL8UlFdh397x+tvM6m1TWpdYG396qS2To/5\nJXWn655fUkc6CX9EbIyIIxHxekTc00UN84mIYxHxakS80vUQY80waKci4rVZ0y6NiJ9FxG+a1zmH\nSeuotvsj4s1m270SEf/UUW1XR8TTEXEoIn4ZEf/STO9027XU1cl2G/tuf0RcCPwauBE4DrwI3JqZ\nvxprIfOIiGPAmszs/JxwRPw98B6w58xoSBHx78Dbmflg84dzaWbePSG13c85jtw8otrmG1n6Njrc\ndsMc8XoYuuj5rwdez8yjmXka+D5wcwd1TLzMfA54+6zJNwO7m/e7mfnPM3bz1DYRMvNkZr7cvH8X\nODOydKfbrqWuTnQR/quA3836fJzJGvI7gZ9GxEsRsbXrYuaw7MzISM3rFR3Xc7aeIzeP01kjS0/M\ntutnxOth6yL8c40mMkmnHG7IzL8FbgK+2uzeamG2AZ9hZhi3k8A3uyymGVl6L/C1zPxjl7XMNkdd\nnWy3LsJ/HLh61udPASc6qGNOmXmieT0FPMnMYcokmTozSGrzeqrjev4kM6cy84PMnAa+TYfbrhlZ\nei/w3cx8opnc+babq66utlsX4X8RuDYiPh0RHwe+ADzVQR0fERFLmh9iiIglwAYmb/Thp4Atzfst\nwL4Oa/mQSRm5eb6Rpel4203aiNedXOTTnMr4L+BCYEdmfmPsRcwhIv6Cmd4eZu54/F6XtUXE48A6\nZu76mgK+Dvw38EPgz4HfAp/PzLH/8DZPbes4x5GbR1TbfCNLv0CH226YI14PpR6v8JNq8go/qSjD\nLxVl+KWiDL9UlOGXijL8UlGGXyrK8EtF/T9txbO6QlN6zQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2737268bcc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nLLE9anu0q04B9FTb4bc9RdJ6Sd+PiPcl/UzSbEkXafzM4MeTrRcRyyNiJCJGetAvgB5pK/y2v6Dx\n4K+JiGckKSL2RsTBiDgk6TFJl/SvTQC9Vht+25b0uKTtEfGTCctnTnjZNyWVbwMLYKi0M9R3uaSX\nJb2h8aE+SVoq6RaNn/KHpF2Svlv9cbC0LYb6jjF1Q4EPPfRQy9odd9xRXPfCCy8s1rnkd3I9G+qL\niC2SJttYcUwfwHDjG35AUoQfSIrwA0kRfiApwg8kRfiBpLh1N3CM4dbdAIoIP5AU4QeSIvxAUoQf\nSIrwA0kRfiCpdu7e20t/kfQ/E55Pq5YNo2HtbVj7kuitU73s7e/afeFAv+TzuZ3bo8N6b79h7W1Y\n+5LorVNN9cZpP5AU4QeSajr8yxvef8mw9jasfUn01qlGemv0Mz+A5jR95AfQkEbCb/ta23+w/bbt\ne5vooRXbu2y/Yfv1pqcYq6ZB22d724RlU21vsr2j+jnpNGkN9bbM9v9W793rtv+1od7Otv3ftrfb\n/r3tf6+WN/reFfpq5H0b+Gm/7eMl/VHS1ZLGJL0i6ZaIGIqbsNveJWkkIhofE7Z9haQPJT0REXOr\nZf8haX9EPFz94jwjIu4Zkt6WSfqw6ZmbqwllZk6cWVrSAkm3qcH3rtDXTWrgfWviyH+JpLcjYmdE\nfCJpraTrG+hj6EXEZkn7P7P4ekmrq8erNf6PZ+Ba9DYUImJPRLxWPf5A0uGZpRt97wp9NaKJ8J8l\n6c8Tno9puKb8Dkm/sf2q7SVNNzOJMw/PjFT9nNFwP59VO3PzIH1mZumhee86mfG615oI/2S3GBqm\nIYfLIuIfJP2LpO9Vp7doT1szNw/KJDNLD4VOZ7zutSbCPybp7AnPvyJpdwN9TCoidlc/90n6pYZv\n9uG9hydJrX7ua7if/zdMMzdPNrO0huC9G6YZr5sI/yuS5tj+qu0vSlooaWMDfXyO7VOrP8TI9qmS\n5mv4Zh/eKGlR9XiRpA0N9vI3hmXm5lYzS6vh927YZrxu5Es+1VDGf0o6XtLKiGg9lesA2Z6l8aO9\nNH7F48+b7M32U5Ku1PhVX3sl/VDSryStk3SOpD9J+lZEDPwPby16u1JHOHNzn3prNbP0VjX43vVy\nxuue9MM3/ICc+IYfkBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGk/g81Kx2HnWsInwAAAABJRU5E\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x273726a6da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    # 展示前五章图片\n",
    "    plt.imshow(imgs[i], cmap = 'gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "# 读取数据集内容,   读取本地 https://blog.csdn.net/qq_34022601/article/details/89645320\n",
    "mnist = fetch_mldata('mnist-original', data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'COL_NAMES': ['label', 'data'],\n",
       " 'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ..., \n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'target': array([ 0.,  0.,  0., ...,  9.,  9.,  9.])}"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* DESCR 数据集描述\n",
    "* data 包含一个数组，每个实例为一行，每个特征为一列\n",
    "* target 包含一个带有标签的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 标签和训练数据\n",
    "X, y = mnist['data'], mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 7w  6w的训练 1w的测试，7w个 784个数据\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(28, 28)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随意去一个下标\n",
    "some_digit = X[12345]\n",
    "# 784个数据，变成行和列\n",
    "some_digit_image = some_digit.reshape(28, 28)\n",
    "some_digit_image.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADIlJREFUeJzt3W+IXPW9x/HP59oGMa2YkDENVt3e\nqFURml6GePEfXqrFhkIs0pA8KBFKU7BCC0VuECH6oCjlVi0ikfS6dAVrW2i95oHc2yASb1FCRtFq\njW00rO2akOxiIcmjovn2wZ7INu6cmcycOWfi9/2CsDPnd86cD0M+e2bmnJ2fI0IA8vmXpgMAaAbl\nB5Ki/EBSlB9IivIDSVF+ICnKDyRF+YGkKD+Q1Kfq3NmKFStiYmKizl0CqUxPT2tubs79rDtU+W3f\nIumnks6S9N8R8UDZ+hMTE+p0OsPsEkCJdrvd97oDv+y3fZakRyV9TdKVkjbZvnLQxwNQr2He86+V\n9HZEHIiIv0v6paT11cQCMGrDlP8CSX9dcH+mWPZPbG+x3bHdmZ2dHWJ3AKo0TPkX+1DhY38fHBE7\nIqIdEe1WqzXE7gBUaZjyz0i6cMH9z0s6OFwcAHUZpvx7JV1q+wu2l0jaKGlnNbEAjNrAp/oi4gPb\nd0r6P82f6puMiD9WlgzASA11nj8inpX0bEVZANSIy3uBpCg/kBTlB5Ki/EBSlB9IivIDSVF+ICnK\nDyRF+YGkKD+QFOUHkqL8QFKUH0iK8gNJUX4gKcoPJEX5gaQoP5AU5QeSovxAUpQfSKrWKbqBhfbv\n3186ftlll5WOb926tXT8/vvvP+1MmXDkB5Ki/EBSlB9IivIDSVF+ICnKDyRF+YGkhjrPb3ta0jFJ\nH0r6ICLaVYRCDsePHy8dt106/uKLL1YZJ50qLvL5j4iYq+BxANSIl/1AUsOWPyT9zvbLtrdUEQhA\nPYZ92X9tRBy0fb6kXbbfiogXFq5Q/FLYIkkXXXTRkLsDUJWhjvwRcbD4eUTS05LWLrLOjohoR0S7\n1WoNszsAFRq4/LaX2v7syduSvirpjaqCARitYV72r5T0dHE65lOSfhER/1tJKgAjN3D5I+KApC9V\nmAXJPPLII0Ntv3z58oqS5MSpPiApyg8kRfmBpCg/kBTlB5Ki/EBSfHU3Ruqtt97qOvb888+XbnvO\nOeeUjt91110DZcI8jvxAUpQfSIryA0lRfiApyg8kRfmBpCg/kBTn+TFSc3Pdv9j53XffLd221xTb\n11xzzUCZMI8jP5AU5QeSovxAUpQfSIryA0lRfiApyg8kxXl+jNTatR+bxOkj69atK9129erVVcfB\nAhz5gaQoP5AU5QeSovxAUpQfSIryA0lRfiCpnuf5bU9K+rqkIxFxVbFsuaRfSZqQNC1pQ0T8bXQx\nMa7uuOOO0vFzzz2369h1111Xuu1NN900UCb0p58j/88l3XLKsq2SnouISyU9V9wHcAbpWf6IeEHS\n+6csXi9pqrg9JenWinMBGLFB3/OvjIhDklT8PL+6SADqMPIP/Gxvsd2x3ZmdnR317gD0adDyH7a9\nSpKKn0e6rRgROyKiHRHtVqs14O4AVG3Q8u+UtLm4vVnSM9XEAVCXnuW3/ZSklyR90faM7W9LekDS\nzbb3S7q5uA/gDNLzPH9EbOoy9JWKs2AMvfbaa6Xj27dvLx233XVscnKydNvzzjuvdBzD4Qo/ICnK\nDyRF+YGkKD+QFOUHkqL8QFJ8dTdK3XPPPUNtv3Tp0q5jV1xxxVCPjeFw5AeSovxAUpQfSIryA0lR\nfiApyg8kRfmBpDjPn9zevXtLx3fv3j3U4993331dx66++uqhHhvD4cgPJEX5gaQoP5AU5QeSovxA\nUpQfSIryA0lxnj+5l156qXT82LFjpeNLliwpHb/hhhtOOxPqwZEfSIryA0lRfiApyg8kRfmBpCg/\nkBTlB5LqeZ7f9qSkr0s6EhFXFcvulfQdSbPFandHxLOjConR2bVrV+l42RTbkrRx48bS8Xa7fdqZ\nUI9+jvw/l3TLIssfiog1xT+KD5xhepY/Il6Q9H4NWQDUaJj3/Hfa/oPtSdvLKksEoBaDln+7pNWS\n1kg6JOkn3Va0vcV2x3Zndna222oAajZQ+SPicER8GBEnJP1M0tqSdXdERDsi2q1Wa9CcACo2UPlt\nr1pw9xuS3qgmDoC69HOq7ylJN0paYXtG0jZJN9peIykkTUv67ggzAhiBnuWPiE2LLH58BFkwAkeP\nHi0d37Nnz1CPPzU1NdT2aA5X+AFJUX4gKcoPJEX5gaQoP5AU5QeS4qu7P+EeffTR0vG5ubnS8ZUr\nV1YZB2OEIz+QFOUHkqL8QFKUH0iK8gNJUX4gKcoPJMV5/k+Asq9H2759+1CPvW3btqG2x/jiyA8k\nRfmBpCg/kBTlB5Ki/EBSlB9IivIDSXGe/wzQa5qzDRs2dB2bmZkp3fbiiy8uHb/99ttLx3Hm4sgP\nJEX5gaQoP5AU5QeSovxAUpQfSIryA0n1PM9v+0JJT0j6nKQTknZExE9tL5f0K0kTkqYlbYiIv40u\nal6dTqd0fPfu3V3H1q1bV7rtbbfdVjp+9tlnl47jzNXPkf8DST+MiCsk/buk79m+UtJWSc9FxKWS\nnivuAzhD9Cx/RByKiFeK28ck7ZN0gaT1kqaK1aYk3TqqkACqd1rv+W1PSPqypD2SVkbEIWn+F4Sk\n86sOB2B0+i6/7c9I+o2kH0TE0dPYbovtju1Or2vUAdSnr/Lb/rTmi/9kRPy2WHzY9qpifJWkI4tt\nGxE7IqIdEe1Wq1VFZgAV6Fl+25b0uKR9EfHggqGdkjYXtzdLeqb6eABGpZ8/6b1W0rckvW771WLZ\n3ZIekPRr29+W9BdJ3xxNRDz22GMDb/vwww+Xjl9yySUDPzbObD3LHxG/l+Quw1+pNg6AunCFH5AU\n5QeSovxAUpQfSIryA0lRfiApvrp7DLz33nul42+++WZNSZAJR34gKcoPJEX5gaQoP5AU5QeSovxA\nUpQfSIrz/GPgwIEDpePvvPNO6fjll1/edWzZsmUDZcInH0d+ICnKDyRF+YGkKD+QFOUHkqL8QFKU\nH0iK8/xj4Prrry8dP3HiRE1JkAlHfiApyg8kRfmBpCg/kBTlB5Ki/EBSlB9Iqmf5bV9o+3nb+2z/\n0fb3i+X32n7P9qvFv3WjjwugKv1c5POBpB9GxCu2PyvpZdu7irGHIuK/RhcPwKj0LH9EHJJ0qLh9\nzPY+SReMOhiA0Tqt9/y2JyR9WdKeYtGdtv9ge9L2ot8XZXuL7Y7tzuzs7FBhAVSn7/Lb/oyk30j6\nQUQclbRd0mpJazT/yuAni20XETsioh0R7VarVUFkAFXoq/y2P6354j8ZEb+VpIg4HBEfRsQJST+T\ntHZ0MQFUrZ9P+y3pcUn7IuLBBctXLVjtG5LeqD4egFHp59P+ayV9S9Lrtl8tlt0taZPtNZJC0rSk\n744kIYCR6OfT/t9L8iJDz1YfB0BduMIPSIryA0lRfiApyg8kRfmBpCg/kBTlB5Ki/EBSlB9IivID\nSVF+ICnKDyRF+YGkKD+QlCOivp3Zs5LeXbBohaS52gKcnnHNNq65JLINqspsF0dEX9+XV2v5P7Zz\nuxMR7cYClBjXbOOaSyLboJrKxst+ICnKDyTVdPl3NLz/MuOabVxzSWQbVCPZGn3PD6A5TR/5ATSk\nkfLbvsX2n2y/bXtrExm6sT1t+/Vi5uFOw1kmbR+x/caCZctt77K9v/i56DRpDWUbi5mbS2aWbvS5\nG7cZr2t/2W/7LEl/lnSzpBlJeyVtiog3aw3She1pSe2IaPycsO0bJB2X9EREXFUs+7Gk9yPigeIX\n57KI+M8xyXavpONNz9xcTCizauHM0pJulXS7GnzuSnJtUAPPWxNH/rWS3o6IAxHxd0m/lLS+gRxj\nLyJekPT+KYvXS5oqbk9p/j9P7bpkGwsRcSgiXiluH5N0cmbpRp+7klyNaKL8F0j664L7MxqvKb9D\n0u9sv2x7S9NhFrGymDb95PTp5zec51Q9Z26u0ykzS4/NczfIjNdVa6L8i83+M06nHK6NiH+T9DVJ\n3yte3qI/fc3cXJdFZpYeC4POeF21Jso/I+nCBfc/L+lgAzkWFREHi59HJD2t8Zt9+PDJSVKLn0ca\nzvORcZq5ebGZpTUGz904zXjdRPn3SrrU9hdsL5G0UdLOBnJ8jO2lxQcxsr1U0lc1frMP75S0ubi9\nWdIzDWb5J+Myc3O3maXV8HM3bjNeN3KRT3Eq42FJZ0majIgf1R5iEbb/VfNHe2l+EtNfNJnN9lOS\nbtT8X30dlrRN0v9I+rWkiyT9RdI3I6L2D966ZLtR8y9dP5q5+eR77JqzXSfp/yW9LulEsfhuzb+/\nbuy5K8m1SQ08b1zhByTFFX5AUpQfSIryA0lRfiApyg8kRfmBpCg/kBTlB5L6B9NUf40a610iAAAA\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x27302db1dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[12345]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练集 和 测试集 训练标签，测试标签\n",
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([29224, 45474, 42834, ..., 18467, 28176, 55400])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集合数据分布均匀，有些机器学习算法对训练实例的顺序敏感\n",
    "import numpy as np\n",
    "# 6w下标，随机排列\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 训练集和训练标签洗牌，然后赋值\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ..., \n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False], dtype=bool)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 识别数字5 ，二元分类5或者非5\n",
    "# 创建目标向量 判断true  false\n",
    "y_train_5 = (y_train == 5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ..., False, False, False],\n",
       "       [False,  True,  True, ..., False, False, False],\n",
       "       [ True,  True, False, ..., False, False, False],\n",
       "       ..., \n",
       "       [ True, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False]], dtype=bool)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# -1在这里应该可以理解为一个正整数通配符，它代替任何整数。我不知道有多少列，numpy会自动帮我计算\n",
    "y_train_5.reshape(20, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 测试集 也拿出5或者 非5\n",
    "y_test_5 = (y_test == 5) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([False], dtype=bool)"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD 梯度下降 分类器， 适合非常大的数据集，独立处理训练集数据，一次一个，适合在线学习，\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "# 随机种子，每次的值一直\n",
    "sgd_clf = SGDClassifier(random_state = 5)\n",
    "# 标签为5的 数据\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "# 预测 somedigit  我设置的1\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.96845,  0.9334 ,  0.92605])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估分类器比评估回归器要困难得多\n",
    "\n",
    "# 3个折叠，正确率达到 95% 以上\n",
    "from sklearn.model_selection import cross_val_score\n",
    "# 交叉验证 cv 测试次数 \n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 把每张图都分类成 非5\n",
    "from sklearn.base import BaseEstimator\n",
    "# 估算器 ，评估非5\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        # 初始化 矩阵，标签就是 5或者非5\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ..., \n",
       "       [False],\n",
       "       [False],\n",
       "       [False]], dtype=bool)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 二维矩阵，非5评估，所以全为false\n",
    "np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.9093 ,  0.91075,  0.9089 ])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 分类器，\n",
    "never_5_clf = Never5Classifier()\n",
    "# 交叉验证\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 准确率超过90% ，因为5的图像大约只有10%，你猜一张图不是5， 90%的时间你都是正确的\n",
    "* 这说明准确率无法成为分类器的首要性能指标，特别是当你处理偏科数据集， 某些类比其他类更为频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 在混淆矩阵中，一个轴表示模型预测的标签，另一个轴表示实际标签。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 评估分类器性能的更好方法是混淆矩阵\n",
    "# A类别实例被分为B类别次数\n",
    "# 想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "# 预测结果\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与 cross_val_score 相比\n",
    "* 同样执行交叉验证\n",
    "* 返回的不是评估分数，是每个折叠的预测\n",
    "* 每一个实例在模型预测时使用的数据，在训练期间从未见过"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54214,   365],\n",
       "       [ 3077,  2344]], dtype=int64)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "# 混淆\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 行表示实际类别，列表示预测类别\n",
    "# 第一行 第一列 53272 被正确的分为 非5 ，真负类\n",
    "# 第一行 第二列 1307 被错误的分类成 5 ，假正类\n",
    "# 第二行 第一列 1077 张被错误的分为 非5， 假负类\n",
    "# 第二行 第二列 4344 张被正确的分在了5 ，真正类\n",
    "# 这种衡量方式太复杂，我们可以用更简单的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 实际的预测标签，完美预测  实际==预测\n",
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 正类预测的准确率 被称为分类器的精度\n",
    "\n",
    "\n",
    "$\n",
    "\\text{精度} = \\cfrac{TP}{TP + FP}\n",
    "$\n",
    "\n",
    "TP是真正类的数量，FP是假正类的数量\n",
    "\n",
    "\n",
    "\n",
    "$\n",
    "\\text{召回率TPR} = \\cfrac{TP}{TP + FN}\n",
    "$\n",
    "* 检测正类实例的比例\n",
    "FN是假负类的数量\n",
    "![jupyter](./zhaohui.jpg)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度和召回率\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.86526393503137689"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "# 实际标签和交叉验证的预测标签，获得精度\n",
    "precision_score(y_train_5, y_train_pred) # 4327 / 4327 + 1276"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.43239254750046119"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获得召回\n",
    "recall_score(y_train_5, y_train_pred)    #  4327 / 4327 + 1094"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 说明 检测一张图的时候，只有90%的概率是准确的，而且只有64%的数字5 被它检测出来\n",
    "# 精度和召回率合成单一指标，成为 F1 分数，谐波平均值\n",
    "# 平均值平等对待所有的值，谐波平均值会给予较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "F_1 = \\cfrac{2}{\\cfrac{1}{\\text{precision}} + \\cfrac{1}{\\text{recall}}} = 2 \\times \\cfrac{\\text{precision}\\, \\times \\, \\text{recall}}{\\text{precision}\\, + \\, \\text{recall}} = \\cfrac{TP}{TP + \\cfrac{FN + FP}{2}}\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.57662976629766305"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "# f1分数\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# F1分数对那些具有相近精度和召回率 分类器更有利，这不一定符合你的期望\n",
    "# 有时候你更关心精度，有时你能关心召回率\n",
    "# 训练一个分类器检测儿童可以放心观看的视频，你可能要求拦截了很多好的视频，低召回率，保留下来的都是安全的视频，高精度\n",
    "# 不能同时增加精度并减少召回率，反之亦然  。。高召回 低精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度/召回率权衡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "![jupyter](./quanheng.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* SGDClassifier对每个实例基于决策函数计算一个分值，大于阀值为正类，否则为负类\n",
    "* 中间阀值右侧找到4个真正类 真5 ， 一个假正类 6， 精度为 4/5 80%\n",
    "* 在所有的6个 真正的5 中，分类器找到了4个，召回率为 4/6 67%\n",
    "* 提高阀值，向右移动，精度提高，召回降低\n",
    "* 反之阀值降低，召回提高，精度降低\n",
    "* SKlearn不可以直接设置阀值，可以访问决策分数，\n",
    "* SGDClassifier 默认阀值为0 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 如何设置阀值【临界值】\n",
    "\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下。以LogisticRegression为例\n",
    "# clf = LogisticRegression()\n",
    "# clf.fit(X_train, y_train)\n",
    "# pred_proba = clf.predict_proba(X_test)[:, 1]\n",
    "# threshold = 0.75  # 阀值设置为0.75\n",
    "# pred_label = pred_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阈值是0.75\n",
    "# pred_label里True就是概率大于0.75的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-226141.47958036])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function  决策值分数\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 默认阈值为0\n",
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False], dtype=bool)"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False], dtype=bool)"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 提高阀值可以降低召回率，提高阀值到200000，就错了这个图\n",
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 如何决定使用什么阀值\n",
    "# 返回决策值，而不是预测结果\n",
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有了y_scores，可以计算所有可能的阀值的精度和召回率\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "# 计算 精度 召回 阈值\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x27302dfe0b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib 绘制精度和召回相对于阀值的函数图\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAF5CAYAAACV7fNGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmYFNW9//HPdzYYVkcgoIYgKCIo\nUcNEHMWIuCRoXGIUkxBjjMbkGtFo1GDixbjHDcl1u+LuxURRo7+4GxHEBaKDiQhIBBEVhIR9X4fz\n++P0pLqHWXpmuqu6u96v55lnzjld3f2lRT5dVadOmXNOAACg8BVFXQAAAAgHoQ8AQEwQ+gAAxASh\nDwBATBD6AADEBKEPAEBMEPoAAMRE6KFvZt3N7I1GHi81s2fN7C0z+0mYtQEAUMhCDX0zq5D0sKT2\njWw2StIM59xhkk41s46hFAcAQIELe0+/RtLpktY2ss1QSRMT7amSKrNcEwAAsVAS5ps559ZKkpk1\ntll7SYsT7ZWSutfdwMzOlXSuJJWUVAzq1KmPVq70jw0cKJWVZa5mAAByzYwZM5Y757o193mhhn6a\n1ksql7RGUodEP4Vzbryk8ZJUWVnpqqurteee0qefSn/5i7Tnnum/2YoVUufOUkkDn8SOHVIR0x0B\nADnEzD5tyfNyMfRnSBoi6UlJB0ianskXX73afzF47TVp6lTpk0+kr39devNN6b33pOpqac4cafZs\n/7Npk/Tww1JpqbRggd++9vfixdLEidIxx0iNH7wAACB6kYa+mQ2TNMA5d0fS8MOSXjCzwyUNkPS3\n1r6Pcz7gx46VXnxR2rYt9fF33/V7+5s31//8005r+LW/+U3py1+W9ttPWrtWuvpq6aCDpC5dWls1\nAACZFUnoO+eGJn6/Jum1Oo99ambHyO/tj3HO1bTmvT78UPqv/5Jef933i4qkYcOkE06QBg/2e+kb\nNvjA799fqqry8wIGDJCmTZOuu07aYw9p332lvfaSeveW+vSRZs2Sxozxr7lokf+R/OtJ0j//Gfws\nWiQde6yfa7B9u9+muLg1fyoAAJrPnHNR19Aqdc/pf/JJcE7/kUekn/5U2rrV73mPGiX9/OdS96Sp\ngf/4hw/lQw6Runbd+fUbO6e/eLF0zz1SRYU/gvDXv6Zf97Zt/vkffSTNm+ePDlRVpf98AEB8mdkM\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x27302e47d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 目标设定为90%的精度，阀值大概在30000左右 , 设置了阀值为30000\n",
    "y_train_pred_90 = (y_scores > 30000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89352818371607512"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.39476111418557464"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 获得了一个90%精度的分类器，但如果召回太低，精度再高，也不怎么有用\n",
    "* 如果工作中，需要99%的精度，你应该回应，召回率是多少？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC 曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 本质是 真正类率tpr和假正类率fpr（错误的分为正类的负类实例比例）\n",
    "# 与召回/精度曲线非常相似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "# 真正  假正 阈值\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f08c518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92900768874095629"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 召回率TPR越高，分类器的假正类FPR就越多\n",
    "* 虚线表示纯随机分类器的ROC曲线，好的分类器应该远离这条线，向左上角\n",
    "* 是使用精度/召回率 PR曲线，还是使用ROC，关键在于 正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "* 例如：前面例子ROC曲线很不错是因为跟负类 非5 相比， 正类 数据5 数量真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 获取训练集中每个实例的分数\n",
    "* RandomForestClassifier 没有descision_function(),但是拥有dict_proda()方法，sklearn中分类器都有这两个中的一个\n",
    "* dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片 70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "# 随机森林分类器\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n",
    "# 交叉验证 交叉执行predict_proba方法 预测概率\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.9,  0.1],\n",
       "       [ 1. ,  0. ],\n",
       "       [ 1. ,  0. ],\n",
       "       ..., \n",
       "       [ 1. ,  0. ],\n",
       "       [ 1. ,  0. ],\n",
       "       [ 0.9,  0.1]])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为决策值：\n",
    "y_scores_forest = y_probas_forest[:, 1] \n",
    "# 真正  假正 阈值\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.1,  0. ,  0. , ...,  0. ,  0. ,  0.1])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f0d6780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 继承了上边的图\n",
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.99350155111778982"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Rand 比SGD 好很多，ROC AUC的分数也高很多\n",
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.98397365532381997"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度和召回率 也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.82678472606530162"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 选择合适的指标利用交叉验证来对分类器进行评估\n",
    "* 选择满足需求的精度/召回率权衡\n",
    "* 使用ROC曲线和ROC AUC分数比较多个模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多类别分类器\n",
    "* 尝试5 之外的检测\n",
    "* 多类别分类器 区分两个以上的类别\n",
    "* 随机森里和朴素贝叶斯可以直接处理多个类别\n",
    "* 支持向量机svm和线性分类器只可以处理二元分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 解决方案\n",
    "1. 将数字图片分类0到9，训练10个二元分类器，每个数字一个，检测一张图片时，获取每个分类器的决策分数，哪个最高属于哪个，称为一对多OvA\n",
    "2. 为每一对数字训练一个二元分类器，区分0，1 区分0，2 区分1，2 称为一对一OvO策略，存在N个类别，需要N*（N-1）/2个分类器，最后看哪个类别获胜最多\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 优缺点\n",
    "* OvO 只需要用到部分训练集对其必须区分两个类别进行训练\n",
    "* 对于较小训练集合OvO比较有优势， 大训练集合 OvA 速度快，所以OvA更常用，比如svm 在数据规模扩大时表现糟糕\n",
    "* sklearn 检查到使用二元分类算法进行多类别分类任务，会自动运行OvA，SVM分类器除外"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 1.])"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预测结果 二元分类器进行多次训练\n",
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-543825.45675124,  181218.25251883,  -81351.29782772,\n",
       "         -86481.01647498, -101659.53038826, -226141.47958036,\n",
       "        -109046.74086154, -191634.18233695, -158694.44774344,\n",
       "        -314948.95911221]])"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内部实际上训练了10个二元分类器，获得图片的决策分数，然后选择了分数最高的类别\n",
    "# 返回10个分数，每个类别1个\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 拿到分数最高的索引\n",
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列，分类标签\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过索引 来拿到分类标签中对应的值\n",
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.])"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "# 把二元分类器，封装成 ovo\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, tol=-np.infty, random_state=42))\n",
    "# 训练\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 多个ovo\n",
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.])"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林 训练 \n",
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林直接将实例分为多个类别，调用predict_proba()可以获得分类器将每个实例分类为每个类别的概率列表\n",
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.8534793 ,  0.87219361,  0.87568135])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确率\n",
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.91036793,  0.91099555,  0.90913637])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放 ，可以得到准确率 90 %以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 实例化\n",
    "scaler = StandardScaler()\n",
    "# 数据缩放\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "# 再次评估\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目流程\n",
    "1. 探索数据准备的选项\n",
    "2. 尝试多个模型\n",
    "3. 选择最佳模型并用GridSearchCV对参数进行微调\n",
    "4. 尽可能自动化\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定了一个相对合适的模型，进一步优化，分析其错误类型\n",
    "* 查看混淆矩阵\n",
    "* 使用cross_val_predict()进行预测\n",
    "* 调用confusion_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "D:\\Anaconda3-5.0.1\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5740,    3,   19,   12,   11,   45,   44,    8,   38,    3],\n",
       "       [   1, 6494,   49,   27,    6,   34,    7,   12,  104,    8],\n",
       "       [  59,   35, 5338,  107,   88,   27,   89,   61,  142,   12],\n",
       "       [  53,   44,  135, 5359,    4,  222,   32,   48,  132,  102],\n",
       "       [  20,   24,   31,    9, 5387,    8,   53,   28,   85,  197],\n",
       "       [  72,   43,   33,  190,   80, 4577,  109,   31,  196,   90],\n",
       "       [  39,   26,   46,    2,   43,   77, 5627,    5,   52,    1],\n",
       "       [  21,   19,   73,   29,   57,   10,    5, 5796,   16,  239],\n",
       "       [  56,  157,   73,  154,   12,  141,   55,   31, 5028,  144],\n",
       "       [  46,   33,   27,   94,  171,   33,    2,  200,   79, 5264]], dtype=int64)"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预测标签\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "# 实际标签和预测标签，进行混淆\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n2QsLC03O3bVrV5Nzt2/f3uRcgMXFxSbnjtv/v8XFRTLTbbiSVjJ6qRijl4oxeqkYo5eKMXqpGKOX\nijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oZ+jbcY/0e\n+8+i5TbcFvPCeM7c6tzXXnutybkA5557bpNzW2x1PmJpaanJuW7DlfSpjF4qxuilYoxeKsbopWKM\nXirG6KVijF4qpnP0EbEzIq5uOYyk9jpFHxGXAGdm5pON55HU2MDoI2Id8BDwRkRc034kSS11udLf\nBOwD7gEujIjbPvnOiJiJiLmImGsxoKTh6hL9BcBsZh4EHgMu++Q7M3M2M6czc7rFgJKGq0v0rwPn\nLL89DexvN46k1iY73OYR4NGI+AGwDri27UiSWhoYfWb+B/j+CGaRNAI+OUcqxuilYoxeKsbopWKM\nXirG6KVihr4Ce2iHjUirVcfjuAK71Wrmlg4cONDk3M2bNzc5F2DDhg1DP/ODDz5gaWnJFdiSVjJ6\nqRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKMXqpGKOXijF6qRijl4oxeqkYo5eKMXqp\nGKOXijF6qRijl4oZ+jbcFttlJye7/HLd47OwsNDk3JYzHzp0qMm569ata3Lu4uJik3Oh3dbh559/\nvsm5AJdeeunQz1xYWHAbrqRPZ/RSMUYvFWP0UjFGLxVj9FIxRi8Vs2r0EbExIp6OiLmIeHBUQ0lq\nZ9CV/kbg8cycBk6NiOkRzCSpoUHRvw2cFxGnAZuBNr8MXNLIDIr+OeBs4HbgFWC++USSmhoU/V3A\nLZl5N/AqcPPRN4iImeXH/HMtBpQ0XIOi3whsiYgJ4CJgxasbMnM2M6eXH/dLOsENiv6XwCzwLjAF\n/Kb5RJKaWvX1n5n5V+BrI5pF0gj45BypGKOXijF6qRijl4oxeqkYo5eKMXqpmKGvwI7otIX3/16L\nVeBHTExMNDn3o48+anJuqzXVACeffHKTc1utRgeYmxv+M9avv/569u3b5wpsSSsZvVSM0UvFGL1U\njNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM0UvFGL1UjNFLxRi9VIzRS8UYvVSM\n0UvFDHsb7j+A/R1v/iXgn0P74KPhzO2N27xwYsx8dmae3uWGQ41+LSJiLjOne/ngx8mZ2xu3eWH8\nZvbuvVSM0UvF9Bn9bI8f+3g5c3vjNi+M2cy9PaaX1A/v3kvFGL1UjNFLxRi9VIzRS8X8FxoxQUh8\ngd6jAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f0d6588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow 函数来查看混淆矩阵的图像表示\n",
    "plt.matshow(conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 看起来不错，大多数图片都在主对角线上，说明它们被正确分类\n",
    "# 数字5 看起来比较暗，说明1. 数字5图片较少  2. 分类器在数字5上执行效果不如其他数字上好\n",
    "# 假设把焦点放在错误上，为取得错误率，而不是错误绝对值，需要将混淆矩阵中每个值除以相应类别中的图片数量\n",
    "\n",
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP0AAAEACAYAAAB4TnCPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAC55JREFUeJzt3X+I3/V9wPHnK5fLD2ZsL0xTlCIE\np+Ba18yvVsEOU7vSKaVsdHQQEqiT0FFSEP+5soVi/9igSCEEEpo2Wf5o41z/2CDQQWUgbSEyMuv8\no4kYNaGpxmS9NTOKmuRe+yOXKXHN93PZ532fHK/n469L7pPXvbjL8z7f+97nPheZiaQ6lgy9gKSF\nZfRSMUYvFWP0UjFGLxVj9FIxRt9BRHwoIv4lIn4cEf8UEcuG3qmLiFgTET8feo/5iIgdEfH5offo\nIiKmIuJHEXEwIr4z9D5dDRJ9ROyOiAMR8TdDvP0rsAH4dmZ+FjgBfG7gfbp6HFg59BJdRcSngI9k\n5v6hd+loI/CDzBwBqyJiNPRCXSx49BHxZ8BEZt4DrI2I31voHeYrM3dk5lNzf7wOODnkPl1ExKeB\nN7nwSeqqFxGTwHeBoxHxhaH36ejXwMci4sPAR4FfDrxPJ0Oc6e8D/nHu5R8D9w6wwxWJiHuAqcx8\nZuhdLmfuy4+twPTQu8zDJuAXwLeAuyJiy8D7dPEz4Cbga8AhYGbYdboZIvrfAX419/IMsGaAHeYt\nIlYD24GHht6lg2lgR2b+ZuhF5mEdsCszTwDfB9YPvE8X3wC+kpnfBA4DXx54n06GiP4M732dec1A\nO8zL3Jnzh8DXM/PY0Pt08BngqxHxNPCJiPjewPt0cQRYO/fyCFgM7+cp4OMRMQF8ElgUP8gSC/0D\nNxGxCbg+Mx+PiMeAFzJz34IuMU8R8VfA3wL/MfdXOzPzyQFX6iwins7M+4beY5yIWAXs4cIjv0ng\ni5n5q8v/q2FFxF3A33PhIf4B4E8z88ywW403RPTXAj8F/hX4E+DuzDy9oEtIhS149HDh+5vAHwM/\nmfsaTtICGSR6ScO56p9Ek9Qvo5eKGSz6iNg81Nu+Uu7c3mLbFxbfzkOe6RfVO2qOO7e32PaFRbaz\nD++lYnp99j4iFt23ApYuXdr52NnZWZYs6fZ5cnZ29kpX6lVmEhGdjl2xYkWzHbo6d+7cvD4mb7/9\n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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f0c5518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 每行代表实际类别，每列代表预测类别\n",
    "# 8，9列比较亮，说明许多图片被错误的分类为数字8，9\n",
    "# 类别8，9行也偏亮，说明数字8和9经常会跟其他数字混淆\n",
    "# 有些很暗，比如行1，大多数数字1都被正确的分类，一些和8混淆\n",
    "# 5和3是错误最多的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结论\n",
    "* 改进数字8和9的分类\n",
    "* 修正数字3和5的混淆\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何优化分类器\n",
    "* 尝试多收集这些数字的训练集\n",
    "* 开发一些新特征来改进分类器\n",
    "* 优化分类器算法\n",
    "* 使用pillow或opencv对图片预处理，让显示模型更突出\n",
    "* 分析单个错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nWo4cOeRi69q1a5psSCnxd70pxcvLS/62jEJISAjt27fn77//BsxVvBr0qeSJn4CT4+7duwA8++yz\nuLu7A3D58mWHTHpHjhwBoESJEjRp0gQwexFb0rBhQ37//XcAPD097W6TJWqXPn78eMaPHy+evsTo\n27cvAFOnTnWIbYp9+/YB0KRJkwTXv+omNGHCBMqUKWP1morDlitXjps3b+Lj4yPHppdr167Jwjgk\nJISZM2cC0Lx58yT7Nk+ePJnPP/9cconU9ZAGtBa0RqPRaDQZkccyC7pYsWIYhkHhwoUB+O6778SN\nqrDMhFa7/Fq1atnVrmzZsknG9YwZM1L8e/369RPbRo0aleYd8OzZswGzf6UllSpVklWlajoNcObM\nGVatWsXOnTsB0xWoskMdTXxPjPoM4u+St23bxptvvgng9J3w2LFjAfO7Dg4OpmrVqsDDnYAmdSjX\nLyC7FkdVLVSsWFH+7+vrC5juaMud5vr16/nnn38AJIPbEezevRtvb28Arly58sjjZ82aBZgVIY50\nmavsccvQDJj3nG+//RYgwe43PDxcwl6JhcfSi4eHh3gEvL29k81q37VrFwCfffYZlSpVSs/ON8U8\nlhNw69at8fLyEjdV/EEaEREhrgZASgzKli1rF3tUMolKY08tly9floFVoECBNNuhkoAKFiwog7Bq\n1apky5ZNPqv4tGnThjp16gBmHFO9hyNJbCJVE/CXX36ZwF2tYsbqNUeyYcMGAL755hsZsB4eHowa\nNYrhw4c71JYnievXr0vsMlu2bIwYMQJwThzzm2++AR4mVDoLdZ2/++67REZGWr2mYtPVqlWTzUfr\n1q2pVasWwcHBQMJFrb0pUqQIAAsWLKBDhw6UKFECMOPUquzo4sWLko8C5t944sQJ+blSpUoSTrQF\nmTNnplu3bo887tixY7Rp0wYwwxB+fn42syE5tAtao9FoNBpnYBiGMx52IzY21vj4448NFxcXw8XF\nxXB3dzdOnz5tnD592p6nTRNRUVFGVFSU4e3tbbi6uhqurq7GwIED0/x+sbGxRmxsrBEWFpai41ev\nXm3kzZtXPqvu3bvLe9ibkSNHGl5eXoaXl1eKjx85cqSBmfAjD0dy8uRJo3DhwkbhwoUNFxcXo27d\nukbdunWNffv22eoUzhqPThnPcXFxRlxcnLFt2zajZs2a8p3Onz/fuHTpkjzi4uLSeopUc+TIEcPD\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730f0a3b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制图片\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因：SGD是一个线性模型，它所做就是为每个像素分配一个各个类别的权重，当它看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 数字3和5在一部分像素位上有区别，所以分类器很容易将其弄混\n",
    "# 通过上面图像，如果书写3 的连接点左移，分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一，就是对图像进行预处理，确保位于中心位置并且没有旋转"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 为每个实例产生多个类别 ，例如 照片识别多个人脸\n",
    "# 分类器经过训练可以识别小红，小白，小军，一张照片 里有 小红，小白\n",
    "# 经过分类器，应该输出[1,1,0]， 是小红，是小白，不是小军\n",
    "# 输出多个二元标签的分类系统称为多标签分类系统\n",
    "\n",
    "\n",
    "# 有些情况，会想让你的分类器给一个样例输出多个类别。比如思考一个人脸识别器，\n",
    "# 并识别出这个是谁。这就需要对于同一张图片，首先识别出有几个人，并给识别出的人贴上标签。\n",
    "# 这就是多个二值标签的分类系统被叫做多标签分类系统。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "# 7 8 9 三张\n",
    "y_train_large = (y_train >= 7)\n",
    "#奇数\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "# 合成综合数据\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "# 算出距离\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]], dtype=bool)"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类，不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97709"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 评估多标签分类器方法很多，方法之一就是测量每个标签的F1分数，或者其他二元分类器指标，然后简单平均\n",
    "# y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)\n",
    "# f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")\n",
    "0.977090"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个权重（该目标标签实例的数量），设置average='weighted'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多输出分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例子：构建一个系统去除图片中的噪声，输入一张有噪声的图片，它将输入一张干净的数字图片，分类器输出是多个标签，一个像素一个标签，每个标签多个值0到255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 分类任务“多输出-多类分类”（或者称为多输出分类）。它是多标签分类的简单泛化，在这里每一个标签可以是多类别的（比如说，可以有多个可能值）\n",
    "\n",
    "# 我们将建立一个系统，它可以去除图片中的噪音。它将有一张混有噪音的图片作为输入，期待他能够输出一个干净的数字图片，用一个像素强度的数组表示，\n",
    "# 注意这个分类器的输出是多标签的（一个像素一个标签）和每个标签可以偶多个值（像素强度取值范围从0到255）。所以他是一个多输出分类系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片 创建训练集和测试集\n",
    "# 初始化 噪声 训练数据\n",
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "# 加到像素\n",
    "X_train_mod = X_train + noise\n",
    "\n",
    "# 测试数据\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730007acf8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 随意找个图片\n",
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 模型训练\n",
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "# 模型预测\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2730007a6d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 拿出图片\n",
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
